Vertikales scrolling...

← Zurück zum Forum

Bei der Aufarbeitung der "Probleme", die ich mit Battle of Eris hatte, habe ich mich nochmal mit dem Scrolling beschäftigt. Dies war bei mir ein großes Problem, da ich den Grobscroll so gemacht habe, daß ich einen sichtbaren und einen nicht sichtbaren Bildschirm hatte, im nicht sichtbaren dann den gesamten Bildschirminhalt - also 1kB - um eine Zeile nach oben bewegt habe und dann umgeschaltet habe. Das kostet natürlich Speicher aber vor allem Rechenzeit. Auch die Kollisionserkennung bei dem Schritt ist problematisch. Dieses Kernproblem muss man also natürlich ganz anders lösen und es gibt da ein paar gute Ansätze und Beschreibungen im Netz. Gestern habe ich mit Janko darüber geschrieben - er hatte mir mal eine kleine Demo gesendet, wo er Graphics 9 scrollt mit Displaylistmanipulation - und hier gibt es mindestens 2 gute Lösungsansätze, die von der Theorie her klar und logisch sind. Hier im Forum habe ich aber dazu keinen Post gefunden und daher würde ich hier an der Stelle auch quasi als Nachschlagsmöglichkeit mit euch zusammen einen möglichst effektiven, verständlichen Code für MADS/Eclipse/WUDSN entwickeln mit folgenden Vorgaben:

  1. Verticales Softscrolling mittels DL-Manipulation
  2. Antic 4 mit 20 Zeilen, die untersten 3 Zeilen Antic 2 ohne Scrolling für die Anzeige.
  3. Zeile 1 verschmindet, in Zeile 20 wird per Random ein oder mehrere Zeichen geprintet. Zeile 20 scrollt auch soft rein...
  4. Einfacher für jeden verständlicher Code

Falls dieses Thema doch schon entsprechend irgendwo im Forum steht, dann habe ich es übersehen.... Mag das Thema auch für die Profis hier langweilig erscheinen, wird es dem Neuling vielleicht aber eine gute Basis geben können.

LG Peter

AntwortZitat

die Seite kenne ich sehr gut und finde sie auch excellent... aber halt in englisch und der Code ist mit den ganze includes unübersichtlich für Anfänger...

vielleicht ist das Thema hier auch uninteressant, dann gerne entsprechendes Feedback!

AntwortZitat

Moin!

Wie man beim ATARI die Bildinhalte scrollt, wird wahrscheinlich den "Programmierern" bekannt sein. Aber es geht ja drum, dass man auch Wissen austauscht und so andere oder vielleicht sogar bessere Ansätze/Routinen kennenlernt. Auch hat man so ein (deutsches) Nachschlagewerk, damit der künftige Programmierer von morgen leichter einsteigen kann.

Ich persönlich fände es toll, wenn gute Ansätze vllt. auch den Weg auf die ABBUC-Seite schaffen, in einem Bereich "Programmierung". Manchmal ist es doch ganz schön anstrengend etwas im Forum wiederzufinden 😳

Grüße Janko

Mein 600XL ist virenfrei!

AntwortZitat

... vielleicht in einer Art Bibliothek für Assembler und Basic. Hier liegen dann z.B. Subroutinen, auf die man gut und schnell zugreifen kann...

AntwortZitat

Hallo!

Der Normalfall ist ja, dass man eine Map, z.B. 80 x 40 Zeichen, im Speicher vorhält und dann per Displaylist(-manipulation) und den Registern VSCROL und HSCROL das Scrolling realisiert. Das ist relativ einfach auf dem ATARI und geht auch ohne (großen) Rechenaufwand.

Das Anliegen ist aber, dass man einen Shooter programmieren möchte, der eine sehr lange Map horizontal ODER vertikal hat. Wenn man die Map komplett im RAM ablegt, bleibt einem nicht viel Speicher für das eigentliche Programm. Zumal die Map nach einer Runde auch ggf. resettet werden muss. Gerade wenn man gerne das Spiel auf ein Modul bringen möchte, sollte man sich gut überlegen, wie man den Speicherplatz einteilt.

Die Idee ist es, nur einen kleinen RAM-Bereich für die Bildschirmdarstellung zu nutzen und die MAP (ggf. komprimiert) im Speicher vorzuhalten und nur die angeforderte Zeile in den Bildschirm zu kopieren.

Eine Möglichkeit beim vertikalen Scrollen wäre, die Zeile, die gerade aus dem Bildschirm herausgescrollt wurde, an der anderen Seite wieder durch Displaylistmanipultaion einzufügen, nur mit neuem Inhalt. Den Bildschirmspeicher selber kopiert man nicht um, da dies zu viel Zeit in Anspruch nehmen würde. Diese Variante ist sehr RAM-sparend, aber der Umgang bei z.B. der Kollisionserkennung ist erschwert.

Eine andere Möglichkeit wäre, dass man zwei Bildschirme untereinander im RAM vorhält und nun den Bildschirmausschnitt vom einem Bereich in den anderen scrollt. Am Ende angekommen beginnt man wieder von vorne. Während des scrollens baut man im nicht sichtbaren Bereich den Inhalt auf. Diese Methode würde auch beim horizontalen Scrollen funktionieren.

Das ist jetzt sehr theoretisch, aber wir sollten ersteinmal Ideen sammeln und dann die favorisierte Idee ggf. anhand von Bildern und Quelltext erarbeiten.

Grüße Janko

Mein 600XL ist virenfrei!

AntwortZitat

Dr. Irata schrieb: die Seite kenne ich sehr gut und finde sie auch excellent... aber halt in englisch und der Code ist mit den ganze includes unübersichtlich für Anfänger...

vielleicht ist das Thema hier auch uninteressant, dann gerne entsprechendes Feedback!

Ich wollte es dir nicht ausreden, dachte aber dass der Aufbau und die Beispiele ein guter Start sein könnten.

Mach weiter, ich finde die Idee gut.

AntwortZitat

Hi,

ich hab vor nicht allzu langer Zeit mal ein bisschen horizontales Scrolling ausprobiert und obwohl ich dachte, daß ich es richtig gemacht hatte waren da Ruckler drin...

Also ich hab bestimmt nichts gegen "erleuchtet mich" 🙂

CU, Erhard

Jede Info, die zu Hause auf meinem Rechner liegt habe ich unterwegs nicht verfügbar. Jede Info, die im Netz liegt finde ich nicht wieder, wenn ich sie benötige.

AntwortZitat

... wie gesagt, diese Woche habe ich noch großen Zeitmangel, danach starte ich hier mit euch zusammen den Vertekalscroll...

AntwortZitat

Ich habe eh superwenig Zeit und drängele bestimmt nicht.

Jede Info, die zu Hause auf meinem Rechner liegt habe ich unterwegs nicht verfügbar. Jede Info, die im Netz liegt finde ich nicht wieder, wenn ich sie benötige.

AntwortZitat

... danke für den Link! Habe mir mal kurz Teil 5 angeschaut und ja, das sieht gut aus... die Beispiele von Peter Finzel sind einfach gut. Das können wir hier sehr gut als Grundlage nutzen und hier tiefer analysieren und dann für MADS umarbeiten denke ich...

AntwortZitat

Hi,

Dr. Irata schrieb: für MADS umarbeiten

noch besser fände ich "plain Assember", also keine MADS-Vereinfachungen wie MVA.

Quelltext in MADS kann gerne zusätzlich, dann lernt man gleichzeitig MADS.

Was meint ihr?

CU, Erhard

Jede Info, die zu Hause auf meinem Rechner liegt habe ich unterwegs nicht verfügbar. Jede Info, die im Netz liegt finde ich nicht wieder, wenn ich sie benötige.

AntwortZitat

Erhard schrieb: noch besser fände ich "plain Assember", also keine MADS-Vereinfachungen wie MVA.

Quelltext in MADS kann gerne zusätzlich, dann lernt man gleichzeitig MADS.

Was meint ihr?

CU, Erhard

Also die Assemblereckenroutinen für's Scrolling habe ich 1:1 in MADS übernommen, da musste nix angepasst werden. Benutze den MADS ohnehin ohne die ganzen Zusatzfeatures, ja selbst Makros benutze ich nicht.

Von daher: Dafür

AntwortZitat

... nun ja, ich nutze bei MADS eigentlich auch nur MVA und MWA .... das finde ich ganz praktisch - meistens 😉

AntwortZitat

Könnte ja auch sein, daß es jemand nativ auf dem Atari machen will.

Ich würde die MADS Vereinfachung als Kommentar einfügen, so a la:

LDA #17 ; Erläuterung bla bla (MVA #17 18)
STA 18
...

CU, Erhard

Jede Info, die zu Hause auf meinem Rechner liegt habe ich unterwegs nicht verfügbar. Jede Info, die im Netz liegt finde ich nicht wieder, wenn ich sie benötige.

AntwortZitat

Hallöle, anbei mein erster kleiner Code für ein einfaches vertikales Scrolling für Antic 4 mit Anzeigefeld unten! Ich habe jetzt mich für die relativ einfache Variante entschieden mit Manipulation der BS-Startadresse in der Displaylist - hier arbeite ich dann mit 2 Bildschirmen und kann somit ein wirklich laufendes Bild erzeugen und in die unterste Zeile entsprechend Zufallszeichen reinprinten... später kann man hier dann Landschaft kontinuierlich einprinten. Ich habe alles so gehalten, daß man es leicht lesen und verwenden kann. Verbesserungen oder Optimierungen gerne... Liebe Grüße Peter

    org $4000

RANDOM   = $d20a
RTCLOK   = $0012
SDLSTL   = $0230
VSCROL   = $d405

dlx = 240
dlx2 = 242

xrandom   .by 00
zaehler   .by 00
zaehlerbs .by 00

      ;----------------- BS Start bei 0/16 = 4096 -
      ;----------------- Antic 4     ------------
dlist   .byte 112,112,112
dl1     .byte 68+32,248,18
:18     .byte 04+32
      .byte 112
      .byte 66,112,17
:4      .byte 02
      .byte 65
      .word dlist
      ;-------------- Start Hauptprogramm ----------------------------- 
      .proc main
start   
      lda <dlist    ; Adresse der Displaylist wird 
      sta sdlstl    ; ins Register eingetragen
      lda >dlist 
      sta sdlstl+1
      lda #208    ; Bildschirmspeicher 1 untere Reihe
      sta dlx
      lda #18
      sta dlx+1
      lda #200    ; Bildschirmspeicher 2 untere Reihe
      sta dlx2
      lda #21
      sta dlx2+1
loop1           
      inc zaehler   ; Feinscrollzähler
      lda zaehler
      cmp #8      ; bei 8 wird der Grobscroll ausgeführt
      bne loop2
      jsr grobscrol
      lda #0      ; anschließend Zähler auf Null
      sta zaehler
loop2   
      lda zaehler   ; Wert vom FeinscrollzählerZähler
      sta vscrol    ; ins Register speichern
      jsr wartes    ; einmal auf den Takt warten - ersetzt VBI
      jmp loop1
      .endp
      .proc grobscrol
      ;------- zunächst wird jeweils die letzte Zeile BS1 und BS2
      ;------- gelöscht 
      ldy #40
loop3   
      lda #0
      sta (dlx),y
      sta (dlx2),y
      iny
      cpy #80
      bne loop3
      ;----------------------------------------------------------
      ;------- hier passiert der eigentliche Grobscroll indem die
      ;------- Bildschirmstartadresse in der Displaylist um 40
      ;------- also eine Zeile erhöht wird
      clc
      lda dl1+1
      adc #40
      sta dl1+1
      lda dl1+2
      adc #0
      sta dl1+2
      ;----------------------------------------------------------
      ;------- die letzten Zeilen BS1 und BS2 müssen auch 
      ;------- weiterwandern... statt zu addieren würde ich 
      ;------- aber mittels Tabellen machen!! Spart CPU-Zeit
      clc
      lda dlx
      adc #40
      sta dlx
      lda dlx+1
      adc #0
      sta dlx+1
      clc
      lda dlx2
      adc #40
      sta dlx2
      lda dlx2+1
      adc #0
      sta dlx2+1
      ;-----------------------------------------------------------
      ;------- hier jetzt noch eine kleine Random-Füll-Routine, die
      ;------- immer in die letzte Zeile ein Randomzeichen an eine 
      ;------- Randomstelle in der Zeile printet.... 
      ;------- ... später muss hier die Landschaft Zeile für Zeil
      ;------- aus einer Tabelle reingeprintet werden...
      lda random
      lsr 
      clc
      adc #16
      lsr
      lsr
      tay
      lda random
      sta (dlx),y
      sta (dlx2),y
      ;-------- nach 19 Zeilen muss der Zeilenzähler auf Null
      ;-------- gesetzt werden, außerdem müssen die Werte für 
      ;-------- dl1  dlx und dlx2 rückgesetzt werden
      inc zaehlerbs
      lda zaehlerbs
      cmp #19
      bne loop4
      lda #0 
      sta zaehlerbs
      lda #208
      sta dlx
      lda #18
      sta dlx+1
      lda #200
      sta dlx2
      lda #21
      sta dlx2+1
      lda #248 
      sta dl1+1
      lda #18 
      sta dl1+2     
loop4     
      rts
      .endp
      .proc wartes
      lda RTCLOK+2
loop5   
      cmp RTCLOK+2
          beq loop5
          rts
        .endp  


      run main
AntwortZitat

Hier meine Routine für feines Scrolling in Graphics 0 (alle Richtungen via Joystick) in ACTION!

;  Programmname    : ScrollDemo
;  Filename        : SCROLL.ACT
;  von             : Carsten Strotmann
;  letzte Aenderung: 20.12.91
;  Bemerkung       :

;INCLUDE "D2:SYSTEM.ACT"

MODULE;

BYTE shscrol=$70, svscrol=$71,
      hscrol=$D404,vscrol=$D405,
      vcount=$D40B

CARD POINTER dlptr=$72, adr, dlstart

CARD sdlstl=$230, sdlstlsav

BYTE ARRAY displayList =
[$70$70$70
 $72$00$00$72$00$00$72$00$00$72$00$00
 $72$00$00$72$00$00$72$00$00$72$00$00
 $72$00$00$72$00$00$72$00$00$72$00$00
 $72$00$00$72$00$00$72$00$00$72$00$00
 $72$00$00$72$00$00$72$00$00$72$00$00
 $72$00$00$72$00$00$72$00$00$72$00$00
 $52$00$00$41$00$00]

PROC SetDL ()

BYTE u

 sdlstlsav=sdlstl
 sdlstl=displaylist

 dlstart=displaylist+4
 adr=0
 dlptr=dlstart

 FOR u=0 TO 24
 DO
  dlptr^=adr
  dlptr==+3
  adr==+40
 OD

 shscrol=2
 svscrol=4

RETURN

PROC ScrollUp ()

BYTE u

 svscrol==&$F ; Groessere Werte ausblenden
 svscrol==+1

; SYNCRONISATION MIT DEM VBI, VER-
; MEIDET FLACKERN!

 DO
 UNTIL vcount>120
 OD

; Scrollregister zuruecksetzen und
; Bildschirmspeicher scrollen

 IF svscrol>=8 THEN
  svscrol=0
  dlptr=displaylist+4
  FOR u=0 TO 24
  DO
   dlptr^==+40
   dlptr==+3
  OD
 FI

 vscrol=svscrol

RETURN

PROC ScrollDwn ()

BYTE u

 svscrol==&$F
 svscrol==-1

 DO
 UNTIL vcount>120
 OD

 IF svscrol=$FF THEN
  svscrol=7
  dlptr=displaylist+4
  FOR u=0 TO 24
  DO
   dlptr^==-40
   dlptr==+3
  OD
 FI

 vscrol=svscrol

RETURN

PROC ScrollLft ()

BYTE u

 shscrol==&7
 shscrol==-1

 DO
 UNTIL vcount>120
 OD

 IF shscrol<=0 THEN
  shscrol=4
  dlptr=displaylist+4
  FOR u=0 TO 24
  DO
   dlptr^==+1
   dlptr==+3
  OD
 FI

 hscrol=shscrol

RETURN

PROC ScrollRght ()

BYTE u

 shscrol==&7
 shscrol==+1

 DO
 UNTIL vcount>120
 OD

 IF shscrol>=4 THEN
  shscrol=0
  dlptr=displaylist+4
  FOR u=0 TO 24
  DO
   dlptr^==-1
   dlptr==+3
  OD
 FI

 hscrol=shscrol

RETURN

PROC Err (BYTE errnum)

 Graphics (0)
 DO
  PrintB (errnum)
 OD

RETURN

PROC Pause (BYTE times)

BYTE u

 FOR u=0 TO times
 DO
  DO
  UNTIL vcount<12
  OD
 OD

RETURN

PROC Main ()

BYTE sti

 Error=Err 

 SetDL ()

 DO
  sti=Stick(0) ! $F
  IF sti&2 THEN
   ScrollDwn ()
  FI
  IF sti&1 THEN
   ScrollUp ()
  FI
  IF sti&4 THEN
   ScrollLft ()
  FI
  IF sti&8 THEN
   ScrollRght ()
  FI

  Pause (1)

 UNTIL Strig(0)=0
 OD

Graphics (0)

RETURN

https://mastodon.social/@cstrotm https://abbuc.social

AntwortZitat

... von Janko kam gerade noch der Tip für die DL:

dlist     .byte 112,112,112
dl1     .byte 68+32,248,18
:17     .byte 04+32
      .byte 04
      .byte 112
      .byte 66,112,17
:4      .byte 02
      .byte 65
      .word dlist

... damit scrollt man die letzte Reihe schön sanft rein!! Danke!

AntwortZitat

Hi,

Dr. Irata schrieb: von Janko kam gerade noch der Tip für die DL:

bei Assembler Quellcodes bitte in eine der ersten Zeilen den verwendeten Assembler reinschreiben.

Zumindest ich erkenne nicht an der Art des Codes mal eben den verwendeten Assembler...

Ansonsten auf jeden Fall Danke.

Jetzt brauch ich nur noch Zeit das auszuprobieren ..

CU, Erhard

Jede Info, die zu Hause auf meinem Rechner liegt habe ich unterwegs nicht verfügbar. Jede Info, die im Netz liegt finde ich nicht wieder, wenn ich sie benötige.

AntwortZitat

In den letzten Tagen habe ich noch an der Scrollroutine gearbeitet und sie etwas erweitert: Man kann jetzt mit dem Joystick nach oben oder unten scrollen... dabei wird jeweils entweder oben oder unten per Zufall ein Zeichen geprintet. Der Code funktioniert sehr stabil und absolut "ruckelfrei" - man muss schon ein wenig Aufwand treiben und sehr genau coden, um das so hinzubekommen.... bis ich den allerletzten Ruckler weg hatte, waren etliche kleine Stellschrauben nötig... Der Gesamtaspekt ist dem von Peter Finzel gar nicht so unähnlich - scheinbar - allerdings viel komplexer. Peter Finzel läßt ja sein Scrolling nach oben und unten über einen ganz fest definierten Speicherbereich scrollen und wenn man zum jeweiligen Ende kommt, ist Feierabend! Mein Code ist ohne Ende in beide Richtungen und kann sehr schön für einen Scroller genutzt werden. Man könnte nun sehr einfach statt der Zufallszeichen eine ganz definierte Landschaft printen. Das geht mit dem Code von Finzel nicht!

; MADS Crossassembler


      org $4000

RANDOM   = $d20a
RTCLOK   = $0012
SDLSTL   = $0230
VSCROL   = $d405
STICK0   = $278

dlx = 240
dlx2 = 242

xrandom   .by 00
zaehler   .by 04
zaehlerbs .by 00


    ;----------------- BS1 Start bei 0/16  = 4096
    ;                  BS1 Ende bei        = 4816
    ;                  BS2 Start bei       = 4856
    ;                  BS2 Ende bei        = 5576
    ;                  DL Start bei 248/16 = 4856 
    ;----- Antic 4 normales Spielfeld a 40 ------

dlist     .byte 112,112,112
dl1     .byte 68+32
dl      .byte 248,18
:17     .byte 04+32
      .byte 04
      .byte 112
      .byte 66,220,14
:3      .byte 02
      .byte 65
      .word dlist

      ;-------------- Start Hauptprogramm ----------------------------- 
      .proc main
start   
      lda <dlist    ; Adresse der Displaylist wird 
      sta sdlstl    ; ins Register eingetragen
      lda >dlist 
      sta sdlstl+1


      lda #208
      sta dlx2
      lda #18
      sta dlx2+1
      lda #240
      sta dlx
      lda #21
      sta dlx+1

      lda #$66
      sta 708     ;Farbe 1
      lda #$7f      
      sta 709     ;Farbe 2
      lda #$00
      sta 710     ;Farbe 3
      lda #$22
      sta 711     ;Farbe 4 
      lda #$00
      sta 712     ;Farbe 5 Hitergrund



loop      
      lda stick0
      cmp #13
      bne @+
      inc zaehler

@     lda stick0
      cmp #14
      bne @+
      dec zaehler

@     lda zaehler
      cmp #8
      bne @+
      jsr scrolup
      lda #0 
      sta zaehler

@     lda zaehler
      cmp #255
      bne @+
      jsr scroldown
      lda #7 
      sta zaehler

@     lda zaehler 
      sta vscrol
      jsr wartes

      jmp loop
      .endp
      .proc scroldown

      ldy #0
@     lda #0
      sta (dlx),y
      sta (dlx2),y
      iny
      cpy #40
      bne @-

      lda random
      lsr 
      clc
      adc #16
      lsr
      lsr
      tay
      lda #7
      sta (dlx),y
      sta (dlx2),y

      sec
      lda dl
      sbc #40
      sta dl
      lda dl+1
      sbc #0
      sta dl+1

      sec
      lda dlx
      sbc #40
      sta dlx
      lda dlx+1
      sbc #0
      sta dlx+1
      sec
      lda dlx2
      sbc #40
      sta dlx2
      lda dlx2+1
      sbc #0
      sta dlx2+1

      dec zaehlerbs
      lda zaehlerbs
      cmp #0
      bne @+
      jmp decr
@     lda zaehlerbs
      cmp #255
      bne @+

decr  
      lda #20 
      sta zaehlerbs

      lda #208
      sta dlx2
      lda #18
      sta dlx2+1
      lda #240
      sta dlx
      lda #21
      sta dlx+1
      lda #248 
      sta dl    
      lda #18 
      sta dl+1
@     
      rts
      .endp
      .proc scrolup

      ldy #40
@     lda #0
      sta (dlx),y
      sta (dlx2),y
      iny
      cpy #80
      bne @-
      clc
      lda dl1+1
      adc #40
      sta dl1+1
      bcc @+
      inc dl1+2
@
      clc
      lda dlx
      adc #40
      sta dlx
      bcc @+
      inc dlx+1
@
      clc
      lda dlx2
      adc #40
      sta dlx2
      bcc @+
      inc dlx2+1
@     
      lda random
      lsr 
      clc
      adc #16
      lsr
      lsr
      tay 
      lda #7
      sta (dlx),y
      sta (dlx2),y  
      inc zaehlerbs
      lda zaehlerbs
      cmp #20
      bne @+
      lda #0 
      sta zaehlerbs
      lda #208
      sta dlx
      lda #18
      sta dlx+1
      lda #240
      sta dlx2
      lda #21
      sta dlx2+1
      lda #248 
      sta dl  
      lda #18 
      sta dl+1
@
      rts
      .endp
      .proc wartes
      lda RTCLOK+2
loop5   
      cmp RTCLOK+2
          beq loop5
          rts
        .endp  


      run main
AntwortZitat

Hallo in die Runde, ich habe jetzt diese gesamte Routine noch um eine relativ einfache horizontal scrolling Möglichkeit ergänzt. Man kann jetzt zusätzlich noch um jeweils 10 Schritte nach links und rechts feinscrollen - also um insgesamt 20 Zeichen. Wenn man das horizontale Feinscrolling implementiert, wird die Zeilenbreite von 40 auf 48 erhöht, um das auszugleichen (ich wollte jetzt für dieses Beispiel nicht die ganzen Adressen ändern) habe ich die Bildschirmbreite von 40 auf 32 reduziert (schmales Anzeigefeld) und somit die plus 8 ausgeglichen, ohne alles ändern zu müssen. Dies ist jetzt der letzte Beitrag hinsichtlich vertikales (und damit auch gleichzeitig horizontales) Feinscrolling. LG Peter

      ; MADS Crossassembler


      org $4000

RANDOM   = $d20a
RTCLOK   = $0012
SDLSTL   = $0230
SDMCTL   = $022f
VSCROL   = $d405
HSCROL   = $d404
STICK0   = $278

dlx = 240
dlx2 = 242

xrandom   .by 00
zaehlerv  .by 04
zaehlerh  .by 04
zaehlerbs .by 00
zaehlerhs     .by 70


    ;----------------- BS1 Start bei 0/16  = 4096
    ;                  BS1 Ende bei        = 4816
    ;                  BS2 Start bei       = 4856
    ;                  BS2 Ende bei        = 5576
    ;                  DL Start bei 248/16 = 4856 
    ;----- Antic 4 schmales Spielfeld a 32 ------

dlist   .byte 112,112,112
dl1     .byte 68+32+16
dl      .byte 248,18
:17     .byte 04+32+16
      .byte 04+16
      .byte 112
      .byte 66,220,14
:3      .byte 02
      .byte 65
      .word dlist

      ;-------------- Start Hauptprogramm ----------------------------- 
      .proc main
start   
      lda <dlist    ; Adresse der Displaylist wird 
      sta sdlstl    ; ins Register eingetragen
      lda >dlist 
      sta sdlstl+1
      dec sdmctl        ;schmales Anzeigefeld 

      lda #208
      sta dlx2
      lda #18
      sta dlx2+1
      lda #240
      sta dlx
      lda #21
      sta dlx+1

      lda #$66
      sta 708     ;Farbe 1
      lda #$7f      
      sta 709     ;Farbe 2
      lda #$00
      sta 710     ;Farbe 3
      lda #$22
      sta 711     ;Farbe 4 
      lda #$00
      sta 712     ;Farbe 5 Hitergrund



loop    

      lda stick0
      cmp#11
      bne weiter1
      lda zaehlerhs
      cmp #1
      bcc @+
      dec zaehlerhs
      dec zaehlerh
@
      lda zaehlerh
      cmp #255
      bne weiter1
      jsr scrolleft
      lda #7 
      sta zaehlerh


weiter1     
      lda stick0
      cmp #7
      bne weiter2

      lda zaehlerhs
      cmp #140
      bcs @+
      inc zaehlerhs
      inc zaehlerh
@
      lda zaehlerh
      cmp #8
      bne weiter2
      jsr scrolright
      lda #0 
      sta zaehlerh


weiter2

      lda stick0
      cmp #13
      bne @+
      inc zaehlerv

@     lda stick0
      cmp #14
      bne @+
      dec zaehlerv

@     lda zaehlerv
      cmp #8
      bne @+
      jsr scrolup
      lda #0 
      sta zaehlerv

@     lda zaehlerv
      cmp #255
      bne @+
      jsr scroldown
      lda #7 
      sta zaehlerv

@     lda zaehlerv 
      sta vscrol
      lda zaehlerh
      sta hscrol
      jsr wartes

      jmp loop
      .endp
      .proc scrolleft

      inc dl
      inc dl

      rts
      .endp
      .proc scrolright

      dec dl
      dec dl

      rts
      .endp
      .proc scroldown

      ldy #0
@     lda #0
      sta (dlx),y
      sta (dlx2),y
      iny
      cpy #40
      bne @-

      lda random
      lsr 
      clc
      adc #16
      lsr
      lsr
      tay
      lda #7
      sta (dlx),y
      sta (dlx2),y

      sec
      lda dl
      sbc #40
      sta dl
      lda dl+1
      sbc #0
      sta dl+1

      sec
      lda dlx
      sbc #40
      sta dlx
      lda dlx+1
      sbc #0
      sta dlx+1
      sec
      lda dlx2
      sbc #40
      sta dlx2
      lda dlx2+1
      sbc #0
      sta dlx2+1

      dec zaehlerbs
      lda zaehlerbs
      cmp #0
      bne @+
      jmp decr
@     lda zaehlerbs
      cmp #255
      bne @+

decr  
      lda #20 
      sta zaehlerbs

      lda #208
      sta dlx2
      lda #18
      sta dlx2+1
      lda #240
      sta dlx
      lda #21
      sta dlx+1
      lda #248 
      sta dl    
      lda #18 
      sta dl+1
@     
      rts
      .endp
      .proc scrolup

      ldy #48
@     lda #0
      sta (dlx),y
      sta (dlx2),y
      iny
      cpy #80
      bne @-
      clc
      lda dl
      adc #40
      sta dl
      bcc @+
      inc dl+1
@
      clc
      lda dlx
      adc #40
      sta dlx
      bcc @+
      inc dlx+1
@
      clc
      lda dlx2
      adc #40
      sta dlx2
      bcc @+
      inc dlx2+1
@     
      lda random
      lsr 
      clc
      adc #16
      lsr
      lsr
      tay 
      lda #7
      sta (dlx),y
      sta (dlx2),y  
      inc zaehlerbs
      lda zaehlerbs
      cmp #20
      bne @+
      lda #0 
      sta zaehlerbs
      lda #208
      sta dlx
      lda #18
      sta dlx+1
      lda #240
      sta dlx2
      lda #21
      sta dlx2+1
      lda #248 
      sta dl  
      lda #18 
      sta dl+1
@
      rts
      .endp
      .proc wartes
      lda RTCLOK+2
loop5   
      cmp RTCLOK+2
          beq loop5
          rts
        .endp  


      run main
AntwortZitat

Ich hatte da beim kurzen Überfliegen den Eindruck, dass man einige kleine Optimierungen am Code vornehmen könnte. Ich hoffe, dass ich am Wochenende die Zeit finde, das genauer zu ergründen.

Ich mache in jedem Fall Meldung, wenn ich das gesichtet habe 😉

PP´s of STARSOFTBerlin____github|meine Webseite|Demozoo

AntwortZitat
      ; MADS Crossassembler


      org $4000

RANDOM   = $d20a
RTCLOK   = $0012
SDLSTL   = $0230
SDMCTL   = $022f
VSCROL   = $d405
HSCROL   = $d404
STICK0   = $278

dlx = 240
dlx2 = 242

xrandom   .by 00
zaehlerv  .by 04
zaehlerh  .by 04
zaehlerbs .by 00
zaehlerhs     .by 70


    ;----------------- BS1 Start bei 0/16  = 4096
    ;                  BS1 Ende bei        = 4816
    ;                  BS2 Start bei       = 4856
    ;                  BS2 Ende bei        = 5576
    ;                  DL Start bei 248/16 = 4856 
    ;----- Antic 4 schmales Spielfeld a 32 ------

dlist     .byte 112,112,112
dl1     .byte 68+32+16
dl      .byte 248,18
:17     .byte 04+32+16
      .byte 04+16
      .byte 112
      .byte 66,220,14
:3      .byte 02
      .byte 65
      .word dlist

      ;-------------- Start Hauptprogramm ----------------------------- 
      .proc main
start   
      lda <dlist    ; Adresse der Displaylist wird 
      sta sdlstl    ; ins Register eingetragen
      lda >dlist 
      sta sdlstl+1
      dec sdmctl        ;schmales Anzeigefeld 

      lda #208
      sta dlx2
      lda #18
      sta dlx2+1
      lda #240
      sta dlx
      lda #21
      sta dlx+1

      lda #$66
      sta 708     ;Farbe 1
      lda #$7f      
      sta 709     ;Farbe 2
      lda #$00
      sta 710     ;Farbe 3
      lda #$22
      sta 711     ;Farbe 4 
      lda #$00
      sta 712     ;Farbe 5 Hintergrund



loop    

      lda stick0
      cmp #11
      bne weiter1
      lda zaehlerhs
      beq @+      ; 0 ist kleiner als 1
    ; cmp #1
    ; bcc @+      ; := Wenn kleiner als 1 springe weiter.
      dec zaehlerhs
      dec zaehlerh
@
      lda zaehlerh
      beq weiter1   ; := 0 oder "Plus" Flag gesetzt?
      bpl weiter1
    ; cmp #255
    ; bne weiter1   ; := kleiner als 0, dann weiter
      jsr scrolleft
      lda #7 
      sta zaehlerh


weiter1     
      lda stick0
      cmp #7
      bne weiter2

      lda zaehlerhs
      cmp #140
      bcs @+
      inc zaehlerhs
      inc zaehlerh
@
      lda zaehlerh
      cmp #8
      bne weiter2
      jsr scrolright
      lda #0 
      sta zaehlerh


weiter2

      lda stick0
      cmp #13
      bne @+
      inc zaehlerv

@     lda stick0
      cmp #14
      bne @+
      dec zaehlerv

@     lda zaehlerv
      cmp #8
      bne @+
      jsr scrolup
      lda #0 
      sta zaehlerv

@     lda zaehlerv
      beq @+      ; Programm läuft auch ohne dieses beq, dann spart man 2 Bytes
      bpl @+
    ; cmp #255
    ; bne @+      ; := nicht kleiner als 0, dann weiter
      jsr scroldown
      lda #7 
      sta zaehlerv

@     lda zaehlerv 
      sta vscrol
      lda zaehlerh
      sta hscrol
      jsr wartes

      jmp loop
      .endp
      .proc scrolleft

      inc dl
      inc dl

      rts
      .endp
      .proc scrolright

      dec dl
      dec dl

      rts
      .endp
      .proc scroldown

    ; ldy #0
      ldy #39     ; Loop gedreht, spart 2 Byte und etwas Zeit
@     lda #0
      sta (dlx),y
      sta (dlx2),y
    ; iny
    ; cpy #40
    ; bne @-
      dey
      bpl @-

      lda random
      lsr 
      clc
      adc #16
      lsr
      lsr
      tay
      lda #7
      sta (dlx),y
      sta (dlx2),y

      sec
      lda dl
      sbc #40
      sta dl
      lda dl+1
      sbc #0
      sta dl+1

      sec
      lda dlx
      sbc #40
      sta dlx
      lda dlx+1
      sbc #0
      sta dlx+1
      sec
      lda dlx2
      sbc #40
      sta dlx2
      lda dlx2+1
      sbc #0
      sta dlx2+1

      dec zaehlerbs
      lda zaehlerbs
    ; cmp #0      ; unnötig
      bne @+
      jmp decr
@     lda zaehlerbs
      beq @+      ; Programm läuft auch ohne dieses beq, dann spart man 2 Bytes
      bpl @+
    ; cmp #255
    ; bne @+      ; := nicht kleiner als 0, dann weiter

decr  
      lda #20 
      sta zaehlerbs

      lda #208
      sta dlx2
      lda #18
      sta dlx2+1
      lda #240
      sta dlx
      lda #21
      sta dlx+1
      lda #248 
      sta dl    
      lda #18 
      sta dl+1
@     
      rts
      .endp
      .proc scrolup

      ldy #48
@     lda #0
      sta (dlx),y
      sta (dlx2),y
      iny
      cpy #80
      bne @-
      clc
      lda dl
      adc #40
      sta dl
      bcc @+
      inc dl+1
@
      clc
      lda dlx
      adc #40
      sta dlx
      bcc @+
      inc dlx+1
@
      clc
      lda dlx2
      adc #40
      sta dlx2
      bcc @+
      inc dlx2+1
@     
      lda random
      lsr 
      clc
      adc #16
      lsr
      lsr
      tay 
      lda #7
      sta (dlx),y
      sta (dlx2),y  
      inc zaehlerbs
      lda zaehlerbs
      cmp #20
      bne @+
      lda #0 
      sta zaehlerbs
      lda #208
      sta dlx
      lda #18
      sta dlx+1
      lda #240
      sta dlx2
      lda #21
      sta dlx2+1
      lda #248 
      sta dl  
      lda #18 
      sta dl+1
@
      rts
      .endp
      .proc wartes
      lda RTCLOK+2
loop5   
      cmp RTCLOK+2
            beq loop5
            rts
          .endp  


      run main

So, hier meine kleinen Anpassungen. Das Programm ist dadurch, statt 495 Bytes "nur" noch 489 Bytes groß, kommentiert man noch die beiden BEQ @+ aus, sogar nur noch 485 Bytes. Einen Hauch schneller wird es sicherlich auch, was bei größeren Aktionen sicherlich auch nicht unwichtig ist.

Edit: Mir ist gerade noch aufgefallen, dass es Sprünge gibt, wenn man Rechts/Links gescrollt hatte und dann Hoch und Runter etwas weiter scrollt. Das liegt nicht an meinen Änderungen. Das muss man sich also nochmal genauer anschauen, wenn man beide Scrollrichtungen haben möchte.

PP´s of STARSOFTBerlin____github|meine Webseite|Demozoo

AntwortZitat

... ja, er springt weil ich relativ einfach beim scrollen nach rechts und links den Wert von dl hochsetze oder runtersetze. Da bekomme ich natürlich einen rechts bzw links - Versatz. Wenn ich dann zusätzlich hoch- und runterscrolle und nach 20 Zeilen den dl-Wert rücksetze, dann passt das natürlich mit dem Seitversatz nicht mehr. Das müsste man entsprechend mit einberechnen.... Wer Lust und Zeit hat, kann sich gerne daran verdingen...

AntwortZitat